%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Fonction de résolution du problème flux-free sur la poutre
%
% Entr�es :
%
% sous-maillage : vecteur de coordonnées des noeuds du sous-maillage
% uh : [vecteur 4x1] extraction de la solution éléments finis
% epsilon : =1 sur le premier �l�ment du patch,
%           =-1 sur le deuxi�me �l�ment du patch,
%
% Sorties :
%
% ie : [matrice 4x4] matrice ie

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [ normeErreur,erreur,F ] = Resolution_fluxfree2( donnees , nSousElements , maillage , uh )

erreur = zeros( (donnees.nombreElements*nSousElements+1)*2 ,1);
F = zeros( (donnees.nombreElements*nSousElements+1)*2 ,1);
K = zeros( (donnees.nombreElements*nSousElements+1)*2 );

sousPoutre.L=donnees.poutre.L/donnees.nombreElements;



for patch=1:donnees.nombreElements
        
    
    % Résolution du problème pour un patch

    [Ee,Fe,Ke] = Resolution_patch_fluxfree(patch,donnees.nombreElements,donnees,nSousElements,maillage,uh,donnees.poutre,sousPoutre) ;
%     %Resolution_patch_fluxfree(
    
    %%%%%%%%%
    
%     plot(Ee)
%     pause;
%     plot(Fe)
%     pause;
%     surf(Ke)
%     pause;
%     
%     pause;
    
    % Assemblage de l'erreur et de l'effort
    
    if patch==1
        
        erreur(1:(nSousElements+1)*2) =  Ee ;
        F(1:(nSousElements+1)*2) =  Fe ;
        K(1:(nSousElements+1)*2,1:(nSousElements+1)*2) =  Ke ;
        
    elseif patch==donnees.nombreElements
        
        erreur(size(erreur,1)-(nSousElements+1)*2+1 : size(erreur,1)) = erreur(size(erreur,1)-(nSousElements+1)*2+1 : size(erreur,1)) +  Ee ;
        F(size(F,1)-(nSousElements+1)*2+1 : size(F,1)) = F(size(F,1)-(nSousElements+1)*2+1 : size(F,1)) + Fe ;
        K(size(K,1)-(nSousElements+1)*2+1 : size(K,1),size(K,1)-(nSousElements+1)*2+1 : size(K,1)) = K(size(K,1)-(nSousElements+1)*2+1 : size(K,1),size(K,1)-(nSousElements+1)*2+1 : size(K,1)) + Ke ;
        
    else
        
        erreur( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ee,1)-1 ) = erreur( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ee,1)-1 ) +  Ee ;
        F( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Fe,1)-1 ) = F( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Fe,1)-1 ) + Fe ;
        K( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ke,1)-1  , (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ke,1)-1 ) = K( (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ke,1)-1  , (2*nSousElements+1)*(patch-2)-(patch-3) : (2*nSousElements+1)*(patch-2)-(patch-3) + size(Ke,1)-1 ) + Ke ;
        
        
    end
    
    %%%%%%%%%%
    

end
   
%     normeErreur = erreur'*K*erreur ;
    
%  
%     
%     if patch==1
%         
%         erreur(1:(nSousElements+1)*2) =  Ee ;
% %        F(1:(nSousElements+1)*2) =  Fe ;
%         
%     elseif patch==donnees.nombreElements
%         
%         erreur(size(U,1)-(nSousElements+1)*2+1 : size(U,1)) =  Ee ;
% %        F(size(F,1)-(nSousElements+1)*2+1 : size(F,1)) =  Fe ;
%         
%     else
%         
%         erreur( (2*nSousElements-1)*(patch-2)-(patch-3) : (2*nSousElements-1)*(patch-2)-(patch-3) + size(Ue,1)-1 ) = erreur( (2*nSousElements-1)*(patch-2)-(patch-3) : (2*nSousElements-1)*(patch-2)-(patch-3) + size(Ue,1)-1 ) +  Ee ;
% %        F( (2*nSousElements-1)*(patch-2)-(patch-3) : (2*nSousElements-1)*(patch-2)-(patch-3) + size(Fe,1)-1 ) = F( (2*nSousElements-1)*(patch-2)-(patch-3) : (2*nSousElements-1)*(patch-2)-(patch-3) + size(Fe,1)-1 ) + Fe ;
%         
%         
%     end
%     


%     patch
%
%     Ue
%     Fe
%
%     pause
%



% Calcul de la norme de l'erreur

% normeErreur = erreur'*(K\erreur) ;

erreur=erreur(3:size(erreur,1));
F=F(3:size(F,1));
K=K(3:size(K,1),3:size(K,2));

normeErreur = erreur'*K*erreur

[A,b]=eig(K);

normeF = F'*(K\F)



%%%%%%%%%%%%


% normeErreur = F'*erreur /((nSousElements+1)*(1+donnees.nombreElements));

end